#!/bin/bash
# 替换文件内容（非大小写敏感）
function file-replace-string-no-case-sensitivity(){
    local fin="$1"
    local old="$2"
    local new="$3"
    if [ -z "$fin" ]; then
        echo "$0 file old new"
        return 1
    fi
    local oldt=`echo $old| sed 's:\/:\\\/:g'`
    local newt=`echo $new| sed 's:\/:\\\/:g'`
(
cat <<EOF
sed 's/$oldt/$newt/gI' -i "$fin"
EOF
) > /tmp/.file.sh
    source /tmp/.file.sh
    rm /tmp/.file.sh
}

function markdownImage2base64Image ()
{
    ## 需要处理的markdown文件
    local inputfile="$1"
    ## 从哪个地方读取img文件
    local imageDir="$2"
    ## 插入base64语句之前，添加多少行空行
    local emptyLine="$3"

    local MARKDOWN_FILE_NAME=""
    local IMAGE_PATH=""
    local SPACE_LINE_NUMBER=100

#    echo "参数说明: -f 需要处理的md文件   -i 图片路径   -s 空行数量"
#    while getopts "f:i:s:" opt; do
#      case $opt in
#        f)
#           MARKDOWN_FILE_NAME=$OPTARG
#           echo "this is -f the arg is ! $OPTARG"
#           ;;
#        i)
#           IMAGE_PATH=$OPTARG
#           echo "this is -i the arg is ! $OPTARG"
#           ;;
#        s)
#          #图像数据之前的空行数量，默认20行
#          SPACE_LINE_NUMBER=$OPTARG
#          echo "this is -s the arg is ! $OPTARG"
#          ;;
#        \?)  #没有的参数，会被存储在?中
#          echo "Invalid option: -$OPTARG"
#          ;;
#      esac
#    done

    if [[ ! -f $inputfile ]];then
        echo "请输入markdown 文件名"
        echo "参数说明: 需要处理的md文件   图片路径   [空行数量,100]"
        return 1
    fi
    MARKDOWN_FILE_NAME="$inputfile"

    if [[ ! -z "$emptyLine" ]];then
        SPACE_LINE_NUMBER=$emptyLine
    fi

    if [[ ! -d $imageDir ]];then
        echo "请输入 markdown 的图形路径"
        echo "参数说明: 需要处理的md文件   图片路径   [空行数量,100]"
        return 1
    fi
    IMAGE_PATH="${imageDir}"

#    cat <<EOF
#    输入文件:  $MARKDOWN_FILE_NAME
#    图像目录:  $IMAGE_PATH
#    尾前空行:  $SPACE_LINE_NUMBER"
#EOF

    # 将 所有图像对应的链接表达式换为 base64(id)
        # (这种写法不如我的)
        #find "$IMAGE_PATH" -type f | while read imagefile
        #do
        #    echo "$imagefile"
        #    filename=$(basename "$imagefile")
        #    fileType="${filename##*.}"
        #    fileType=$(echo $fileType | tr '[:upper:]' '[:lower:]')
        #    filename_without_extension="${filename%.*}"

        #    if [[ ($fileType = "jpg") || ($fileType = "jpeg") || ($fileType = "png") || ($fileType = "gif") || ($fileType = "svg") || ($fileType = "webp") || ($fileType = "bmp") || ($fileType = "tif") ]];
        #    then
        #        ## ![1555555321007](1555555321007.png)
        #        OLD_IMAGE_PLAYHOLD="\\!\\[${filename_without_extension}\\]"
        #        NEW_IMAGE_PLAYHOLD="![avatar][${filename_without_extension}]"
        #        sed -i -e "s|$OLD_IMAGE_PLAYHOLD|$NEW_IMAGE_PLAYHOLD|g" $MARKDOWN_FILE_NAME
        #    fi
        #done
    # 将 文件内的 图像链接表达式换为 base64(id)
    local link_list=/tmp/.link.list
    rm -rf $link_list
    grep -oP "\!\[.*?]\(.*?\)" "$inputfile" | while read expression
    do
        ## 检查是否为本地链接
        local isLocalLink=`echo "$expression"| grep -F "${IMAGE_PATH}"`
        if [ -z "$isLocalLink" ]; then
            echo "SKIP $expression"
            continue
        fi

        ## 提取链接的地址
        link=`echo $expression | sed  -E  "s/(\!\[.*]\()(.+)(.*\))/\2/g"`

        echo $link >> $link_list
        local filename=$(basename "$link")
        local filename_without_extension="${filename%.*}"
        #echo $filename_without_extension

        ## 下载成功以后，替换对应的链接
#       把
#          ![123](vx_images/2120938-20201219113846689-729653061.png)
#       变成
#          ![123](2120938-20201219113846689-729653061)
        #linkLocal="$outputdir/`basename $link`"
        file-replace-string-no-case-sensitivity "$inputfile" "($link)" "[$filename_without_extension]"
    done

    # 创建空行
    for ((i=1; i<=$SPACE_LINE_NUMBER; i++))
    do
        echo -e "\n" >> "$MARKDOWN_FILE_NAME"
    done

    # 将base64-id依赖的信息，补充在末尾。
    touch "$link_list"
    cat "$link_list"  | while read imagefile
    do
        filename=$(basename "$imagefile")
        fileType="${filename##*.}"
        fileType=$(echo $fileType | tr '[:upper:]' '[:lower:]')
        #filename=$(basename "$imagefile")
        filename_without_extension="${filename%.*}"
        if [ -z "$fileType" ]; then
            fileType=png
        fi

        if [[ ($fileType = "jpg") || ($fileType = "jpeg") || ($fileType = "png") || ($fileType = "gif") || ($fileType = "svg") || ($fileType = "webp") || ($fileType = "bmp") || ($fileType = "tif") ]];
        then
            #base64 参数：-w 参数为每隔多少字符换行，0表示不换行
            base64Content="$(base64 -w 0 "${imagefile}")"
            echo "[${filename_without_extension}]:data:image/${fileType};base64,${base64Content}" >> "$MARKDOWN_FILE_NAME"
            echo "" >> "$MARKDOWN_FILE_NAME"
        else
            echo "很抱歉,${imagefile}是图片文件吗？${fileType}格式目前不支持."
        fi
    done
}

function top_do ()
{
    local HERE=`pwd`
    # 指定处理markdown目录
    fromDir="$1"
    if [ ! -d "$fromDir" ]; then
        fromDir=parserResult2
    fi
    parserDir=parserResult3
    rm $parserDir -rf

    cp -rfv   $fromDir $parserDir
    cd $parserDir
    imageDir=`find . -mindepth 1 -maxdepth 1 -type d`
    #find "$parserDir" -name "*.md" | while read inputfile
    find . -name "*.md" | while read inputfile
    do
        echo "$inputfile"
        markdownImage2base64Image "$inputfile" `basename "$imageDir"` # 50
    done
    cd $HERE
}
top_do "$@"
